package com.chen.base.utils.file;

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.*;
import lombok.SneakyThrows;
import lombok.experimental.UtilityClass;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;

/**
 * @author: ~龙~
 * @date: 2023/5/9 15:48
 **/
@UtilityClass
public class PdfUtil {
    /**
     * 根据模板创建生成pdf
     * @param map 模板中的表单数据 key-表单属性名；value-表单属性值
     * @param templatePdfPath 模板路径
     * @param outPdfPath 输出路径
     * @return 返回生成的pdf文件路径
     */
    @SneakyThrows
    public String createPdfByTemplate(Map<String,Object> map, String templatePdfPath,String outPdfPath) {
        //设置字体是必须要的，不然没法向模板pdf里写值
        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
        // 读取pdf模板
        PdfReader reader = new PdfReader(templatePdfPath);
        ByteArrayOutputStream bros = new ByteArrayOutputStream();
        //获取表单
        PdfStamper stamp = new PdfStamper(reader,bros);
        //拿到pdf模板中的表单属性
        AcroFields form = stamp.getAcroFields();
        //设置字体
        form.addSubstitutionFont(bfChinese);
        //遍历表单属性，对每个属性赋值
        for (String name : form.getFields().keySet()) {
            Object value = map.get(name);
            form.setField(name, value != null ? value.toString() : "");
        }
        // 如果为false那么生成的PDF文件还能编辑，一定要设为true
        stamp.setFormFlattening(true);
        stamp.close();

        Document doc = new Document();
        PdfCopy copy = new PdfCopy(doc, new FileOutputStream(new File(outPdfPath)));
        doc.open();

        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bros.toByteArray()), i);
            copy.addPage(importPage);
        }

        bros.close();
        doc.close();
        return outPdfPath;
    }
}
